package models

import (
	"errors"
	"fmt"
	"github.com/garyburd/redigo/redis"
)


var (
	Pool *redis.Pool
	C redis.Conn
	err error
	RedisObject RedisConn
)

func init() {
	Pool = &redis.Pool{     //实例化一个连接池
		MaxIdle:16,    //最初的连接数量
		// MaxActive:1000000,    //最大连接数量
		MaxActive:0,    //连接池最大连接数量,不确定可以用0（0表示自动定义），按需分配
		IdleTimeout:60,    //连接关闭时间 300秒 （300秒不使用自动关闭）
		Dial: func() (redis.Conn ,error){     //要连接的redis数据库
			return redis.Dial("tcp","localhost:6379")
		},
	}
	RedisObject = RedisConn{}
}

type RedisConn struct {}


// SetProblems 设置缓存问题1分钟
func (c *RedisConn) SetProblems(key string,value string) error{
	C = Pool.Get()
	_,err = C.Do("set",key,value,"Ex","60")
	if err != nil {
		str := fmt.Sprintf("-- > 添加信息失败 \n实际错误信息：%v",err)
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}
	return nil
}


// GetProblems 获取缓存信息
func (c *RedisConn) GetProblems(key string)(string,error){
	C = Pool.Get()
	for {
		res,err := C.Do("get",key)
		if err != nil {
			str := fmt.Sprintf("-- > 获取缓存失败 \n实际错误信息：%v",err)
			logFmt.Warning(str)
			err = errors.New(str)
			return "",err
		}
		if res == nil {
			logFmt.Info("-- > 缓存失效")
			Problem.Questions = key
			err := Model.GetProblems(Problem)
			if err != nil {
				str := fmt.Sprintf("-- > 未能找到有效数据 \n实际错误信息：%v",err)
				logFmt.Warning(str)
				err = errors.New(str)
				return "",err
			}
			err = c.SetProblems(Problem.Questions,Problem.Answers)
			if err != nil {
				logFmt.Info("-- > 缓存设置失败")
				return "",err
			}
		}
		res1, ok := res.([]byte)
		if !ok {
			fmt.Println("类型转换失败")
		}
		return string(res1),nil
	}
}